<!--
  Copyright 2016 The LUCI Authors. All rights reserved.
  Use of this source code is governed under the Apache License, Version 2.0
  that can be found in the LICENSE file.
  -->

<!doctype html>
<title>rpc-descriptor-util</title>

<script src="../../bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../rpc-descriptor-util.html">
<link rel="import" href="descriptor.html">

<script>
  suite('rpcExplorer.descUtil', function() {
    var util = rpcExplorer.descUtil;

    suite('resolve', function() {
      function testResolve(fullName, type, name) {
        test(fullName, function () {
          var result = util.resolve(discoveryDescriptor, fullName);
          expect(result).to.ok;
          expect(result.type).to.equal(type);
          expect(result.desc).to.ok;
          expect(result.desc.name).to.equal(name);
        });
      }

      testResolve('discovery.Discovery', 'service', 'Discovery');
      testResolve('discovery.Discovery.Describe', 'method', 'Describe');
      testResolve(
          'google.protobuf.FileDescriptorSet',
          'messageType',
          'FileDescriptorSet');
      testResolve(
          'google.protobuf.FileDescriptorSet.file',
          'field',
          'file');
      testResolve(
          'google.protobuf.FieldDescriptorProto.Type',
          'enumType',
          'Type');
      testResolve(
          'google.protobuf.FieldOptions.JSType.JS_NORMAL',
          'enumValue',
          'JS_NORMAL');
    });

    suite('annotate', function() {
      var descriptor = JSON.parse(JSON.stringify(discoveryDescriptor));
      util.annotateSet(descriptor);

      function testAnnotate(name, comment) {
        test(name, function() {
          var desc = util.resolve(descriptor, name).desc;
          expect(desc).to.be.ok;
          expect(desc.sourceCodeInfo).to.be.ok;
          expect(desc.sourceCodeInfo.leadingComments).to.equal(comment);
        });
      }

      testAnnotate(
          'discovery.Discovery',
          ' Discovery describes services.\n');
      testAnnotate(
          'discovery.Discovery.Describe',
          (' Describe returns a list of services and a ' +
           'descriptor.FileDescriptorSet\n that covers them all.\n'));
      testAnnotate(
          'discovery.Void',
          ' Void is an empty message.\n');
      testAnnotate(
          'discovery.DescribeResponse.services',
          ' Services are service names provided by a server.\n');
      testAnnotate(
          'google.protobuf.FileOptions.OptimizeMode',
          ' Generated classes can be optimized for speed or code size.\n');
      testAnnotate(
          'google.protobuf.FieldOptions.JSType.JS_NORMAL',
          ' Use the default type.\n');
    });
  });
</script>
